 // 2. 数据劫持：为data的属性提供get/set,同时更新DOM元素
function  Observer(data) {
  this.$data = data
  // 处理data
  Object.keys(data).forEach(key => {
    this.defineReactive(this.$data,key,this.$data[key])
  })
 
}

Observer.prototype.defineReactive = function(data, key, value) {
  
      Object.defineProperty(data,key,{
        enumerable: true,
        configurable: false,
        get() {
          // 下面的写法会造成内存溢出（死循环）：get里面调用了get
          // return data[key]
          return value

        },
        set(val) {
          if(val === value) return 
          value = val
          // 更新DOM
          // v-text -> msg abc -> xyz
          // v-model -> age 10 -> 20
          // {{}} -> size: 18->19
          // bus  来自eventEmitter.js  执行事件
          bus.$emit(key)
        }
      })
}